package club.kingyin.easycache.proxy;

import club.kingyin.easycache.key.InvokePostProcess;
import club.kingyin.easycache.key.EasyCacheKey;
import club.kingyin.easycache.cache.AbstractCache;
import club.kingyin.easycache.method.CacheMethod;

/**
 * 基于Invoke处理器，但是区分为更细腻的流程处理
 * 即不对Key进行替换操作，所有Key相关操作都在父接口中完成
 * 该接口仅完成Invoke的打断判断和后续Invoke执行流程
 * 未来扩展：基于此特性可用完成更复杂的缓存更新，即指定更新（而非粗旷的直接删除法）
 * pre(Interceptor)-invoke-after(cache)
 */
public interface ProxyCacheInvokePostProcess extends InvokePostProcess<CacheMethod> {

    /**
     * 打断缓存执行流程
     * 区别于责任链，缓存打断链中的所有步骤都会执行，选择最后一个处理链的结果作为打断条件
     * @param pre 上一级处理器链
     * @param target 目标方法
     * @param key 最终Key
     * @return 打断条件
     */
    boolean getCacheInterceptor(boolean pre, CacheMethod target, EasyCacheKey key);

    /**
     * 此流程操作无效
     * @param target 目标方法
     */
    @Override
    default void postProcessBeforeEasyCacheKey(CacheMethod target) {

    }

    /**
     * 此流程操作无效
     * @param target 目标方法
     * @param key 原始构建Key
     * @return 原始Key
     */
    @Override
    default EasyCacheKey postProcessAfterEasyCacheKey(CacheMethod target, EasyCacheKey key) {
        return key;
    }

    /**
     * 流程结束后执行的操作，注意res可能为null
     * @param target 目标方法
     * @param cache 当前缓存模组
     * @param res 执行后的返回值
     * @param key 当前key
     */
    void postProcessAfterGetCache(CacheMethod target,AbstractCache cache, Object res, EasyCacheKey key);

}
